package com.itheima.advice;

import com.itheima.ex.BusinessException;
import com.itheima.ex.SystemException;
import com.itheima.vo.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * bean是属于父容器的bean，还是子容器？
 *   子容器
 * @author by itheima
 * @Date 2022/4/27
 * @Description 定义全局异常处理器
 * @RestControllerAdvice说明：
 *  等价于@ControllerAdvice+@Responbody ,而@ControllerAdvice是@Componment注解的衍生注解
 *  也就是当前注解作用的类也可被实例化为bean对象被ioc容器管理
 */
@RestControllerAdvice
//@ControllerAdvice
public class ProjectExceptionAdvice {

    /**
     *  @ExceptionHandler(Exception.class)指定当前方法处理的异常类型
     *      好处：专业的方法处理对应的异常
     * @param ex 当出现指定的类型后，会将异常对象传入该方法
     * @return
     *  其它异常：未知异常
     */
    @ExceptionHandler(Exception.class)
//    @ResponseBody
    public Result handlerException(Exception ex){
        System.out.println(ex.getMessage());
        return new Result(666,ex.getMessage());
    }

    /**
     * 处理业务异常
     * @param exc
     * @return
     */
    @ExceptionHandler(BusinessException.class)
    public Result handlerBusinessException(BusinessException exc){
        System.out.println(exc.getMessage());
        //可给用户提示信息
        return new Result(exc.getCode(),exc.getMessage());
    }

    /**
     * 处理业务异常
     * @param exc
     * @return
     */
    @ExceptionHandler(SystemException.class)
    public Result handlerSystemException(SystemException exc){
        System.out.println(exc.getMessage());
        //可给用户提示信息-安抚用户
        //给运维人员发送提醒信息
        return new Result(exc.getCode(),exc.getMessage());
    }
}
